home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / gfx / show / gs503_data.lha / Ghostscript / data / gs_pdf.ps < prev    next >
Text File  |  1997-08-14  |  18KB  |  611 lines

  1. %    Copyright (C) 1994, 1996, 1997 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % gs_pdf.ps
  16. % ProcSet for PostScript files created by the PDF to PostScript converter.
  17. % This ProcSet requires only a Level 1 interpreter, unless fonts other
  18. % than ordinary Type 1 or Type 3 fonts are involved.
  19.  
  20. % pdf2ps copies this file from %BEGIN to the end.
  21.  
  22. %BEGIN
  23. mark                % patches
  24. /currentglobal { false }
  25. /setglobal { pop }
  26. /packedarray { array astore readonly }
  27. /setcmykcolor {
  28.   1 exch sub
  29.   4 -1 roll 1 exch sub 1 index mul
  30.   4 -1 roll 1 exch sub 2 index mul
  31.   4 -2 roll exch 1 exch sub mul
  32.   setrgbcolor
  33. }
  34. /setpagedevice {
  35.   statusdict /pageparams get exec
  36.   4 index /PageSize .knownget { aload pop 6 -2 roll pop pop 4 2 roll } if
  37.   4 index /Orientation .knownget { 3 -1 roll pop exch } if
  38.   statusdict /setpageparams get exec
  39.   /PageOffset .knownget { aload pop translate } if
  40. }
  41. /setoverprint { pop }
  42. /setstrokeadjust { pop }
  43. /.copydict { dup 3 -1 roll { put dup } forall pop }
  44. /.dicttomark {
  45.   counttomark 2 idiv dup dict begin { def } repeat pop currentdict end
  46. }
  47. /.knownget { 2 copy known { get true } { pop pop false } ifelse }
  48. /.setdefaultscreen { }
  49. counttomark 2 idiv {
  50.   1 index where { pop pop pop } { bind executeonly def } ifelse
  51. } repeat pop
  52.  
  53. currentglobal true setglobal
  54.  
  55. % Define pdfmark.  Don't allow it to be bound in.
  56. % Also don't define it in systemdict, because this leads some Adobe code
  57. % to think this interpreter is a distiller.
  58. % (If this interpreter really is a distiller, don't do this.)
  59. systemdict /pdfmark known not
  60.  { userdict /pdfmark { cleartomark } bind put } if
  61.  
  62. % This ProcSet is designed so that it can be used either to execute PDF
  63. % (the default) or to convert PDF to PostScript.  See ! and ~ below.
  64.  
  65. userdict /GS_PDF_ProcSet 119 dict dup begin
  66.  
  67. % ---------------- Abbreviations ---------------- %
  68.  
  69. /bdef { bind def } bind def
  70.  
  71. % ---------------- Operator execution ---------------- %
  72.  
  73. % We record "operator" names in a dictionary with their argument counts,
  74. % so that they can easily be redefined later to write PostScript in
  75. % addition to (or instead of) being executed.
  76.  
  77. /numargsdict 100 dict def
  78. /!        % <procname> <proc> <numargs> ! -
  79.  { //numargsdict 3 index 3 -1 roll put def
  80.  } bdef
  81. /~        % <procname> <opname> <numargs> ~ -
  82.  { exch cvx 1 packedarray cvx exch !
  83.  } bdef
  84.  
  85. % ---------------- Graphics state stack ---------------- %
  86.  
  87. % PDF adds a number of parameters to the graphics state.
  88. % We implement this by pushing and popping a dictionary
  89. % each time we do a PDF gsave or grestore.
  90. % The keys in this dictionary are as follows:
  91. %    self            % identifies the dictionary as one of ours
  92. %    Show
  93. %    TextOrigin        % origin of current line, in text space
  94. %    TextSaveMatrix        % matrix at time of BT
  95. % (The following correspond directly to PDF state parameters.)
  96. %    FillColor
  97. %    FillColorSpace
  98. %    StrokeColor
  99. %    StrokeColorSpace
  100. %    TextSpacing
  101. %    TextHScaling
  102. %    Leading
  103. %    TextFont
  104. %    TextMatrix
  105. %    TextRise
  106. %    TextRenderingMode
  107. %    WordSpacing
  108.  
  109. /nodict 1 dict def
  110. nodict /self { //nodict } executeonly put
  111. nodict readonly pop
  112.  
  113. /beginpage
  114.  { //nodict 20 dict .copydict begin graphicsbeginpage textbeginpage
  115.  } bdef
  116. /endpage
  117.  { showpage end
  118.  } bdef
  119.  
  120. /graphicsbeginpage { initgraphics  0 g  0 G } bdef
  121.  
  122. /gput        % <value> <key> gput -
  123.  { exch currentdict //nodict eq { /self dup load end 5 dict begin def } if
  124.         % If we're in a Level 1 system, we need to grow the
  125.         % dictionary explicitly.
  126.    currentdict length currentdict maxlength ge %eq
  127.     { currentdict dup length 3 mul 2 idiv 1 add dict .copydict end begin 
  128.     }
  129.    if def
  130.  } bdef
  131.  
  132. /q_
  133.  { gsave //nodict begin
  134.  } bdef
  135. /q /q_ load 0 !
  136. % Some PDF files have excess Q operators!
  137. /Q_
  138.  { currentdict /self .knownget { exec //nodict eq { end grestore } if } if
  139.  } bdef
  140. /Q /Q_ load 0 !
  141.  
  142. % ---------------- Graphics state parameters ---------------- %
  143.  
  144. /d /setdash 2 ~
  145. /i /setflat 1 ~
  146. /j /setlinejoin 1 ~
  147. /J /setlinecap 1 ~
  148. /M /setmiterlimit 1 ~
  149. /w /setlinewidth 1 ~
  150.  
  151. % ---------------- Color setting ---------------- %
  152.  
  153. /fcput        % <color> <colorspace> fcput -
  154.  { /FillColorSpace gput /FillColor gput
  155.  } bdef
  156. /scput        % <color> <colorspace> scput -
  157.  { /StrokeColorSpace gput /StrokeColor gput
  158.  } bdef
  159.  
  160. /csdevgray [/DeviceGray] readonly def
  161. /csdevrgb [/DeviceRGB] readonly def
  162. /csdevcmyk [/DeviceCMYK] readonly def
  163. /nullpattern1 mark
  164.    /PatternType 1 /PaintType 1 /TilingType 3 /BBox [0 0 0 0]
  165.    /XStep 1 /YStep 1 /PaintProc { }
  166. .dicttomark readonly def
  167. /nullpattern2 nullpattern1 dup length dict copy readonly def
  168.  
  169. /CSdict 11 dict dup begin
  170.   /DeviceGray { 0 exch } bdef
  171.   /DeviceRGB { [0 0 0] cvx exch } bdef
  172.   /DeviceCMYK { [0 0 0 1] cvx exch } bdef
  173.   /Indexed
  174.    { dup 1 get csset exch pop
  175.      dup 2 index 1 get eq
  176.       { pop }
  177.       { exch 4 array copy dup 1 4 -1 roll put }
  178.      ifelse 0 exch
  179.     } bdef
  180.   /setcolorrendering where
  181.    { pop
  182.      /CalGray
  183.       { 1 get dup /Gamma .knownget
  184.      { dup length 1 add dict .copydict
  185.        dup /DecodeA 4 -1 roll /exp load 2 packedarray cvx put
  186.          }
  187.     if /CIEBasedA exch 2 array astore 0 exch
  188.       } bdef
  189.      /CalRGB
  190.       { 1 get dup /Gamma known 1 index /Matrix known or
  191.      { dup length 2 add dict .copydict
  192.        dup /Matrix .knownget { 1 index /MatrixABC 3 -1 roll put } if
  193.        dup /Gamma .knownget
  194.         { [ exch { /exp load 2 packedarray cvx } forall
  195.           ] 1 index /DecodeABC 3 -1 roll put
  196.         }
  197.        if
  198.          }
  199.     if /CIEBasedABC exch 2 array astore [0 0 0] cvx exch
  200.       } bdef
  201.      /CalCMYK { pop //csdevcmyk csset } bdef    % not supported yet
  202.    }
  203.    { /CalGray { pop //csdevgray csset } bdef
  204.      /CalRGB { pop //csdevrgb csset } bdef
  205.      /CalCMYK { pop //csdevcmyk csset } bdef
  206.    }
  207.   ifelse
  208.   /Pattern
  209.    { //nullpattern1 1 index type /nametype ne
  210.       { 1 index length 0 ne { pop //nullpattern2 } if
  211.       } if
  212.      matrix makepattern exch
  213.    } bdef
  214. end def
  215. /csset            % <cspace> csset <color> <cspace'>
  216.  { dup dup type /nametype ne { 0 get } if //CSdict exch get exec
  217.  } bdef
  218.  
  219. /g { //csdevgray fcput } 1 !
  220. /G { //csdevgray scput } 1 !
  221. /rg { 3 array astore cvx //csdevrgb fcput } 3 !
  222. /RG { 3 array astore cvx //csdevrgb scput } 3 !
  223. /k { 4 array astore cvx //csdevcmyk fcput } 4 !
  224. /K { 4 array astore cvx //csdevcmyk scput } 4 !
  225. /cs { csset fcput } 1 !
  226. /CS { csset scput } 1 !
  227. % We have to break up sc according to the number of operands.
  228. /sc1 { /FillColor gput } 1 !
  229. /SC1 { /StrokeColor gput } 1 !
  230. /sc2 { /FillColor gput } 2 !
  231. /SC2 { /StrokeColor gput } 2 !
  232. /sc3 { /FillColor load astore pop } 3 !
  233. /SC3 { /StrokeColor load astore pop } 3 !
  234. /sc4 { /FillColor load astore pop } 4 !
  235. /SC4 { /StrokeColor load astore pop } 4 !
  236. /sc5 { /FillColor gput } 5 !
  237. /SC5 { /StrokeColor gput } 5 !
  238.  
  239. % ---------------- Color installation ---------------- %
  240.  
  241. % Establish a given color (and color space) as current.
  242. /setfillcolor { FillColor FillColorSpace setgcolor } def
  243. /setstrokecolor { StrokeColor StrokeColorSpace setgcolor } def
  244. /CIdict mark            % only used for Level 1
  245.   /DeviceGray 1   /DeviceRGB 3   /DeviceCMYK 4
  246.   /CIEBaseA 1   /CIEBaseABC 3   /CIEBasedDEF 3   /CIEBaseDEFG 4
  247. .dicttomark def
  248. /Cdict 11 dict dup begin    % <color...> <colorspace> -proc- -
  249.   /DeviceGray { pop setgray } bdef
  250.   /DeviceRGB { pop setrgbcolor } bdef
  251.   /DeviceCMYK { pop setcmykcolor } bdef
  252.   /CIEBasedA
  253.    { dup currentcolorspace eq { pop } { setcolorspace } ifelse setcolor } bdef
  254.   /CIEBasedABC /CIEBasedA load def
  255.   /CIEBasedDEF /CIEBasedA load def
  256.   /CIEBasedDEFG /CIEBasedA load def
  257.   /Indexed /setcolorspace where
  258.    { pop /CIEBasedA load }
  259.    { /setindexedcolor cvx }
  260.   ifelse def
  261.   /Pattern
  262.    { dup currentcolorspace eq { pop } { setcolorspace } ifelse
  263.      dup /Matrix get makepattern setcolor
  264.    } bdef
  265. end def
  266. /setindexedcolor        % <index> [/Indexed base hival proc|str]
  267.                 %   setindexedcolor - (only used for Level 1)
  268.  { mark 3 -1 roll
  269.    2 index 3 get    % Stack: cspace -mark- index proc|str
  270.    dup type /stringtype eq
  271.     { //CIdict 4 index 1 get 0 get get        % # of components
  272.       dup 4 -1 roll mul exch getinterval { 255 div } forall
  273.     }
  274.     { exec
  275.     }
  276.    ifelse
  277.    counttomark 2 add -2 roll pop
  278.    1 get setgcolor
  279.  } bdef
  280. /setgcolor    % (null | <color...>) <colorspace> setgcolor -
  281.  { 1 index null eq
  282.     { pop pop }
  283.     { dup 0 get //Cdict exch get exec }
  284.    ifelse
  285.  } bdef
  286. /fsexec        % <fillop|strokeop> fsexec -
  287.  {        % Preserve the current point, if any.
  288.     { currentpoint } stopped
  289.     { $error /newerror false put   cvx exec }
  290.     { 3 -1 roll cvx exec moveto }
  291.    ifelse
  292.  } bdef
  293.  
  294. % ---------------- Transformations ---------------- %
  295.  
  296. /cmmatrix matrix def
  297. /cm { //cmmatrix astore concat } 6 !
  298.  
  299. % ---------------- Path creation ---------------- %
  300.  
  301. /m /moveto 2 ~
  302. /l /lineto 2 ~
  303. /c /curveto 6 ~
  304. /h /closepath 0 ~
  305. /v { currentpoint 6 2 roll curveto } 4 !
  306. /y { 2 copy curveto } 4 !
  307. /re
  308.  { 4 2 roll moveto  exch dup 0 rlineto  0 3 -1 roll rlineto  neg 0 rlineto
  309.    closepath
  310.  } 4 !
  311.  
  312. % ---------------- Path painting and clipping ---------------- %
  313.  
  314. /S_ { setstrokecolor /stroke fsexec } bdef
  315. /S { S_ } 0 !
  316. /f { setfillcolor /fill fsexec } 0 !
  317. /f* { setfillcolor /eofill fsexec } 0 !
  318. /n_ { newpath } bdef        % don't allow n_ to get bound in
  319. /n { n_ } 0 !
  320. /s { closepath S_ } 0 !
  321. /B_ { gsave setfillcolor fill grestore S_ } bdef
  322. /B /B_ load 0 !
  323. /b { closepath B_ } 0 !
  324. /B*_ { gsave setfillcolor eofill grestore S_ } bdef
  325. /B* /B*_ load 0 !
  326. /b* { closepath B*_ } 0 !
  327.  
  328. % Clipping:
  329.  
  330. /Wdict 4 dict dup begin
  331. /S_ { gsave setstrokecolor stroke grestore n_ } bdef
  332. /f { gsave setfillcolor fill grestore n_ } 0 !
  333. /f* { gsave setfillcolor eofill grestore n_ } 0 !
  334. /n_ { end clip newpath } bdef
  335. end readonly def
  336. /W { //Wdict begin } 0 !
  337. /W*dict 4 dict dup begin
  338. /S_ { gsave setstrokecolor stroke grestore n_ } bdef
  339. /f { gsave setfillcolor fill grestore n_ } 0 !
  340. /f* { gsave setfillcolor eofill grestore n_ } 0 !
  341. /n_ { end eoclip newpath } bdef
  342. end readonly def
  343. /W* { //W*dict begin } 0 !
  344.  
  345. % ---------------- Images ---------------- %
  346.  
  347. % We mustn't bind these now, since they reference Level 2 operators.
  348. /Is        % <imagedict> Is <imagedict> <datasource>
  349.  { dup /DataSource get string /readstring cvx /currentfile cvx
  350.         % Stack: imagedict string -readstring- -currentfile-
  351.    3 index /FilterProc .knownget
  352.     { dup dup 0 get /ASCIIHexDecode eq exch length 2 eq and
  353.        { pop exch pop /readhexstring cvx exch }
  354.        { exch exec exch exec }
  355.       ifelse
  356.     }
  357.    if 3 1 roll /pop cvx 4 packedarray cvx
  358.  } bdef
  359. /EI { } def    % placeholder, only needed when writing PostScript
  360. % Note that ID* take a dictionary, not separate values;
  361. % ColorSpace must be a name if it has no parameters;
  362. % DataSource is the size of the row buffer in bytes;
  363. % FilterProc is an optional procedure for constructing the decoding filter;
  364. % and ImageMask is required, not optional.
  365. /csimage
  366.  { /setcolorspace where
  367.     { pop dup /ColorSpace get csset setcolorspace pop image }
  368.     { .colorspaceimage }
  369.    ifelse
  370.  } def        % don't bind, because of Level 2
  371. /ID    % <imagedict> ID -
  372.  { Is dup 3 -1 roll dup /ImageMask get
  373.     { setfillcolor dup /Interpolate .knownget not { false } if
  374.        { dup /DataSource 4 -1 roll put /imagemask cvx exec
  375.        }
  376.        {  { /Width /Height /Decode /ImageMatrix }
  377.       { 1 index exch get exch }
  378.      forall pop exch 0 get 0 ne exch
  379.      5 -1 roll imagemask
  380.        }
  381.       ifelse
  382.     }
  383.     { dup /ColorSpace get /DeviceGray eq
  384.       1 index /BitsPerComponent get 8 le and
  385.       1 index /Decode get dup 1 get 1 eq exch 0 get 0 eq and and
  386.       1 index /Interpolate .knownget not { false } if not and
  387.        {  { /Width /Height /BitsPerComponent /ImageMatrix }
  388.       { 1 index exch get exch }
  389.      forall pop 5 -1 roll image
  390.        }
  391.        { dup /DataSource 4 -1 roll put csimage
  392.        }
  393.       ifelse
  394.     }
  395.    ifelse
  396.         % If we were reading with readhexstring,
  397.         % skip the terminating > now.
  398.         % Stack: datasource
  399.    dup type /filetype ne        % array or packedarray
  400.     { dup 2 get /readhexstring eq
  401.        {  { dup 0 get exec read pop (>) 0 get eq { exit } if } loop
  402.        }
  403.       if pop
  404.     }
  405.     { pop
  406.     }
  407.    ifelse EI
  408.  } 1 !
  409. % IDx handles general images.
  410. /IDx    % <imagedict> IDx -
  411.  { Is 1 index /DataSource 3 -1 roll put
  412.    csimage EI
  413.  } 1 !
  414.  
  415. % ---------------- Text control ---------------- %
  416.  
  417. /textbeginpage
  418.  { /TextSpacing 0 def        % 0 Tc
  419.    /TextLeading 0 def        % 0 TL
  420.    /TextRenderingMode 0 def    % 0 Tr
  421.    /TextRise 0 def        % 0 Ts
  422.    /WordSpacing 0 def        % 0 Tw
  423.    /TextHScaling 1.0 def    % 100 Tz
  424.    /TextFont null def
  425.    /Show { showfirst } def
  426.  } bdef
  427.  
  428. % Contrary to the statement in the PDF manual, BT and ET *can* be nested,
  429. % if the CharProc for a Type 3 font does a BT/ET itself.
  430. % Since we always call the CharProc inside a q_/Q_, we simply ensure that
  431. % the text state is saved and restored like the rest of the extended
  432. % graphics state.
  433.  
  434. /settextmatrix
  435.  { TextMatrix concat
  436.    TextHScaling 1 ne { TextHScaling 1 scale } if
  437.    TextRise 0 ne { 0 TextRise translate } if
  438.  } bdef
  439. /settextstate { TextSaveMatrix setmatrix settextmatrix } bdef
  440.  
  441. /BT
  442.  { currentdict /TextMatrix .knownget
  443.     { identmatrix pop }
  444.     { matrix /TextMatrix gput }
  445.    ifelse
  446.    currentdict /TextOrigin .knownget
  447.     { dup 0 0 put 1 0 put }
  448.     { [0 0] cvx /TextOrigin gput }
  449.    ifelse
  450.     { showfirst } /Show gput
  451.    currentdict /TextSaveMatrix .knownget not
  452.     { matrix dup /TextSaveMatrix gput }
  453.    if currentmatrix pop settextmatrix 0 0 moveto
  454.    TextFont dup null eq { pop } { setfont } ifelse
  455.  } bind 0 !
  456. /ET
  457.  { TextSaveMatrix setmatrix
  458.  } bind 0 !
  459. /Tc_ { /TextSpacing gput { showfirst } /Show gput } bdef
  460. /Tc { Tc_ } 1 !
  461. /TL { /TextLeading gput } bind 1 !
  462. /Tr { /TextRenderingMode gput { showfirst } /Show gput } bind 1 !
  463. /Ts { /TextRise gput settextstate } bind 1 !
  464. /Tw_ { /WordSpacing gput { showfirst } /Show gput } bdef
  465. /Tw { Tw_ } 1 !
  466. /Tz { 100 div /TextHScaling gput settextstate } bind 1 !
  467.  
  468. % ---------------- Font control ---------------- %
  469.  
  470. /Tf        % <font> <scale> Tf -
  471.  { dup 1 eq { pop } { scalefont } ifelse
  472.    dup setfont /TextFont gput
  473.  } 2 !
  474.  
  475. % Read a CFF font.
  476. /FRD        % <resdict> <file> FRD -
  477.  { /FontSetInit /ProcSet findresource begin ReadData
  478.  } 2 !
  479.  
  480. % Copy a font, removing its FID.  If changed is true, also remove
  481. % the UniqueID and XUID, if any.  If the original dictionary doesn't have
  482. % the keys being removed, don't copy it.
  483. /.copyfontdict        % <font> <changed> .copyfontdict <dict>
  484.  { 1 index /FID known
  485.    1 index { 2 index /UniqueID known or 2 index /XUID known or } if
  486.     {        % We add 1 to the length just in case the original
  487.         % didn't have a FID.
  488.       exch dup length 1 add dict exch
  489.        {        % Stack: changed newfont key value
  490.      1 index /FID eq 4 index
  491.       { 2 index /UniqueID eq or 2 index /XUID eq or }
  492.      if not { 3 copy put } if pop pop
  493.        }
  494.       forall exch
  495.     }
  496.    if pop
  497.  } bdef
  498.  
  499. % Insert a new Encoding or Metrics into a font if necessary.
  500. % Return a possibly updated font, and a flag to indicate whether
  501. % the font was actually copied.
  502. /.updatefont        % <font> <Encoding|null> <Metrics|null> .updatefont
  503.             %   <font'> <copied>
  504.  { 2 index 4 1 roll
  505.    dup null ne
  506.     { 3 -1 roll true .copyfontdict dup /Metrics 4 -1 roll put exch }
  507.     { pop }
  508.    ifelse
  509.    dup null ne 1 index 3 index /Encoding get ne and
  510.     { exch false .copyfontdict dup /Encoding 4 -1 roll put }
  511.     { pop }
  512.    ifelse exch 1 index ne
  513.  } bdef
  514.  
  515. % ---------------- Text positioning ---------------- %
  516.  
  517. /Td_
  518.  { TextOrigin exch 4 -1 roll add 3 1 roll add
  519.    2 copy /TextOrigin load astore pop moveto
  520.  } bdef
  521. /Td { Td_ } 2 !
  522. /TD { dup neg /TextLeading gput Td_ } 2 !
  523. /T*_ { 0 TextLeading neg Td_ } bdef
  524. /T* { T*_ } 0 !
  525. /Tm
  526.  { TextMatrix astore pop settextstate
  527.    0 0 /TextOrigin load astore pop
  528.    0 0 moveto
  529.  } 6 !
  530.  
  531. % ---------------- Text painting ---------------- %
  532.  
  533. /textrenderingprocs [        % (0 is handled specially)
  534.    { tf } { tS } { tB } { tn }
  535.     % We don't know what the clipping modes mean....
  536.    4 copy
  537. ] readonly def
  538. /setshowstate
  539.  { WordSpacing 0 eq TextSpacing 0 eq and
  540.     { TextRenderingMode 0 eq
  541.        { { setfillcolor show } }
  542.        { { false charpath textrenderingprocs TextRenderingMode get exec } }
  543.       ifelse
  544.     }
  545.     { TextRenderingMode 0 eq
  546.        { WordSpacing 0 eq
  547.           { { setfillcolor TextSpacing exch 0 exch ashow } }
  548.       { TextSpacing 0 eq
  549.          { { setfillcolor WordSpacing exch 0 exch 32 exch widthshow } }
  550.          { { setfillcolor WordSpacing exch TextSpacing exch 0 32 4 2 roll 0 exch awidthshow } }
  551.         ifelse
  552.       }
  553.      ifelse
  554.        }
  555.        { { WordSpacing TextSpacing 2 index
  556.             % Implement the combination of t3 and false charpath.
  557.             % Stack: xword xchar string
  558.        0 1 2 index length 1 sub
  559.         { 2 copy 1 getinterval false charpath
  560.             % Stack: xword xchar string i
  561.           4 copy get 32 eq { add } { exch pop } ifelse 0 rmoveto
  562.           pop
  563.         }
  564.        for pop pop pop pop
  565.        textrenderingprocs TextRenderingMode get exec
  566.      }
  567.        }
  568.       ifelse
  569.     }
  570.    ifelse /Show gput
  571.  } bdef
  572. /showfirst { setshowstate Show } def
  573.  
  574. /Tj { Show } 1 !
  575. /' { T*_ Show } 1 !
  576. /" { exch Tc_ exch Tw_ T*_ Show } 3 !
  577. % TJ expects a mark followed by arguments, not an array.
  578. /TJ
  579.  { counttomark -1 1
  580.     { -1 roll dup type /stringtype eq
  581.        { Show
  582.        }
  583.        { -1000 div
  584.      currentfont /ScaleMatrix .knownget { 0 get mul } if
  585.      0 rmoveto
  586.        }
  587.       ifelse
  588.     }
  589.    for pop
  590. % Adobe implementations don't accept /[, so we don't either.
  591.  } ([) cvn !
  592.  
  593. /tf { setfillcolor currentpoint fill moveto } bdef
  594. /tn { currentpoint newpath moveto } bdef
  595. % For stroking characters, temporarily restore the graphics CTM so that
  596. % the line width will be transformed properly.
  597. /Tmatrix matrix def
  598. /tS
  599.  { setstrokecolor
  600.    currentpoint //Tmatrix currentmatrix TextSaveMatrix setmatrix stroke
  601.    setmatrix moveto
  602.  } bdef
  603. /tB { gsave tf grestore tS } bdef
  604.  
  605. end readonly put        % GS_PDF_ProcSet
  606.  
  607. setglobal
  608.